/*
 *
 * Copyright (C) 2008 Jose Javier García Zornoza.
 * 
 * Este es un programa libre; puedes distribuirlo y/o modificarlo bajo
 * los términos de la versión 2 (o cualquier versión posterior) de la Licencia 
 * Pública General de la Fundación de Software Libre.
 * Este programa se distribuye con la esperanza  de poder ser útil, pero sin
 * NINGUNA GARANTIA; tampoco la garantía implícita de COMERCIALIZACION o DEDICACIÓN
 * A UN PROPOSITO PARTICULAR. Ver la licencia GNU GPL para más detalles.
 * Deberías haber recibido una copia de la licencia GNU GPL con este programa;
 * en caso contrario puedes obtener una copia visitando el sitio web www.fsf.org
 * o escribiendo a la Fundación de Software Libre, Inc., 59 Temple 
 * Place - Suite 330, Boston, MA  02111-1307, USA. 
 *
 */
package org.gruposp2p.dnie.xml.validation;

import java.io.File;
import java.io.StringReader;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Validator;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.gruposp2p.dnie.utils.FileUtils;
import org.gruposp2p.dnie.utils.XmlUtils;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class SchemaValidator{
        
    //Rutas de los schemas
    public static final String SCHEMA_FIRMAE = FileUtils.BASEDIR + 
            File.separator + "firmae" + File.separator + "recursos"+ 
            File.separator +"Firma_0.1.xsd";

    private static Logger logger =
            LoggerFactory.getLogger(SchemaValidator.class);    
    
    public void validarSchema(String rutaXML) throws Exception {        
        Schema schema = compilarSchema(SCHEMA_FIRMAE);
        Validator validator = schema.newValidator();
        ManejadoraErrores manejadoraErrores = new ManejadoraErrores (); 
        validator.setErrorHandler(manejadoraErrores);
        validator.validate(new StreamSource(rutaXML));
    }
    
    public void validarSchema(Document doc) throws Exception {         
        Schema schema = compilarSchema(SCHEMA_FIRMAE);
        Validator validator = schema.newValidator();
        ManejadoraErrores manejadoraErrores = new ManejadoraErrores (); 
        validator.setErrorHandler(manejadoraErrores);
        validator.validate(new StreamSource(new StringReader (
                XmlUtils.getStringFromDocument(doc))));
    }
    
    /** 
     *  Parsea el schema dado y devuelve una representación en memoria de dicho schema.
     *  Compilar el schema es muy simple, simplemente se pasa la ruta del schema
     *  a la función <code>newSchema()</code> que parsea el schema, comprueba su 
     *  validez, crea una representación en memoria y devuelve un objeto <code>Schema</code>. 
     *  Si el schema incluye/importa otros schemas, estos también serán
     *  parseados.
     *  @param String ruta al archivo que representa el schema
     *  @return Schema representacion en memoria del schema
     */
    public static Schema compilarSchema(String rutaSchema) throws SAXException{
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        return sf.newSchema(new File(rutaSchema));        
    }
    
    private class ManejadoraErrores implements org.xml.sax.ErrorHandler{
        
        public void error(SAXParseException exception) throws SAXException {
            logger.error(exception.getMessage(), exception);
            throw exception;
        }     
        public void fatalError(SAXParseException exception) throws SAXException {
            logger.error(exception.getMessage(), exception);
            throw exception;  
        }		    
        public void warning(SAXParseException exception) throws SAXException {
            logger.error(exception.getMessage(), exception);
        }	
    }   

 }